package binary_search.leetcode_35;

public class SearchInsert {
    public static void main(String[] args) {
        int[] arr = new int[]{1,3,5,6};
        int i = searchInsert(arr, 2);
        System.out.println(i);
    }
    public static int searchInsert(int[] nums, int target) {
        //edge case
        if (nums == null || nums.length == 0) {
            return 0;
        }
        int len = nums.length;

        //由于是升序数组，那么如果最后一个元素 < target， 那么插入位置就是 len
        if (nums[len - 1] < target) {
            return len;
        }

        //开始二分查找
        int left = 0;
        int right = len - 1;
        while (left < right) {
            int mid = left + (right - left) / 2;
            // 严格小于target，则mid及左边肯定不存在target
            if(nums[mid] < target){
                //向右收缩，下一轮的搜索区间：[mid + 1, right]
                left = mid + 1;
            }else{
                // 大于等于target，则mid位置可能就是插入位置或者在mid左边存在。
                //向左收缩，下一轮的搜索区间[left, mid]
                right = mid;
            }
        }
        //此时 left == right, 区间[left , right]只有一个元素，一定存在要插入元素的位置
        return left;

        //也可以在最后判断插入位置是len的情况
//        return nums[left] < target ? left + 1 : left;
    }
}
